/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ec.edu.ucuenca.pagina_asos.uimanager;

import ec.edu.ucuenca.pagina_asos.controller.EscuelaJpaController;
import ec.edu.ucuenca.pagina_asos.controller.GenericController;
import ec.edu.ucuenca.pagina_asos.entity.Documento;
import ec.edu.ucuenca.pagina_asos.entity.Escuela;
import ec.edu.ucuenca.pagina_asos.entity.Galeria;
import ec.edu.ucuenca.pagina_asos.entity.Usuario;
import ec.edu.ucuenca.pagina_asos.uimanager.util.JsfUtil;
import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.el.ELContext;
import javax.el.ValueExpression;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.imageio.ImageIO;
import javax.servlet.ServletContext;
import javax.servlet.http.Part;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

/**
 *
 * @author Jose Ortiz
 */
@ManagedBean
@SessionScoped
public class GestorGalerias implements Serializable {

    static private String path_Imagenes = "/resources/Galerias/";
    private Galeria galeriaActual = new Galeria();
    private Documento documentoActual = new Documento();
    private String num_foto_temporal;
   
    private boolean editandoDocumento = false;
    private boolean editandoGaleria = false;
    private final EscuelaJpaController escuelaController = new EscuelaJpaController();
    private List<Galeria> galerias = new ArrayList<Galeria>();
    private List<Documento> fotos = new ArrayList<Documento>();
    private List<Documento> videos = new ArrayList<Documento>();
    private UploadedFile part;

    public void cargarGalerias(Escuela escuela) {
        galerias = escuelaController.obtenerGalerias(escuela);
    }

    public void cargarFotos(Galeria galeria) {
        fotos = escuelaController.obtenerFotos(galeria);
    }
    
    public void cargarVideos(Galeria galeria) {
        videos = escuelaController.obtenerVideos(galeria);
    }
    
//-----------------------------------------
    public static GestorGalerias getInstance() {
        ELContext context = FacesContext.getCurrentInstance().getELContext();
        ValueExpression ex = FacesContext.getCurrentInstance().getApplication().getExpressionFactory().
                createValueExpression(context, "#{gestorGalerias}", GestorGalerias.class);
        return (GestorGalerias) ex.getValue(context);
    }

    public List<Galeria> GetGalerias() {
        GestorUsuario instance = GestorUsuario.getInstance();
        if (instance.estaLogeado()) {
            GenericController<Galeria> gdocx = new GenericController();
            Usuario usuarioActual = instance.getUsuarioActual();
            Escuela escuela = usuarioActual.getPersona().getEscuela();
            List<Galeria> findWhere = gdocx.findWhere(galeriaActual, "idEscuela='" + escuela.getId() + "'");
            return findWhere;
        } else {
            return new ArrayList();
        }
    }

    public String editarGaleria(Galeria edi) {
        galeriaActual = edi;
        editandoGaleria = true;
        return "/backend/FrmCrearGaleria?faces-redirect=true";
    }

    
     public void handleFileUpload(FileUploadEvent event) {  
       part=event.getFile();
    }  
    
    
    public String borrarGaleria(Galeria edi) {
        GenericController<Galeria> gdocx = new GenericController();
        gdocx.setObjeto(new Galeria());
        GenericController<Documento> gdocxx = new GenericController();
        gdocxx.setObjeto(new Documento());
        for (Documento s : edi.getDocumentos()) {
            String path = realPath(path_Imagenes + s.getId() + ".jpg");
            File sq = new File(path);
            sq.delete();
            gdocxx.destroy(s, s.getId());
        }
        gdocx.destroy(edi, edi.getId());
        return "/backend/FrmGalerias?faces-redirect=true";
    }

    public Galeria getGaleria() {
        return galeriaActual;
    }

    public void setGaleria(Galeria galeria) {
        this.galeriaActual = galeria;
    }

    public boolean isEditando() {
        return editandoDocumento;
    }

    public void setEditando(boolean editando) {
        this.editandoDocumento = editando;
    }

    /**
     * Creates a new instance of GestorGalerias
     */
    public GestorGalerias() {
    }



    public Documento getNuevo() {
        return documentoActual;
    }

    public void setNuevo(Documento nuevo) {
        this.documentoActual = nuevo;
    }

    public String getNum_foto_temporal() {
        return num_foto_temporal;
    }

    public void setNum_foto_temporal(String num_foto_temporal) {
        this.num_foto_temporal = num_foto_temporal;
    }

    public String GenerarIDTemporal() {
        String s = "9999999";
        for (int i = 0; i < 10; i++) {
            String k = (Math.random() + "").charAt(2) + "";
            s += k;
        }
        num_foto_temporal = s;
        return s;
    }

    public void agregarDocumento() {

        if (documentoActual.getNombre() == null || documentoActual.getNombre().compareTo("") == 0) {
            JsfUtil.addErrorMessage("Debe ingresar un nombre para el documento");
            return;
        }
        if (documentoActual.getDescripcion() == null || documentoActual.getDescripcion().compareTo("") == 0) {
            JsfUtil.addErrorMessage("Debe ingresar una descripcion para el documento");
            return;
        }
        if (documentoActual.getTipo() == 1 && (documentoActual.getLink() == null || documentoActual.getLink().compareTo("") == 0)) {
            JsfUtil.addErrorMessage("Debe ingresar un link para el video");
            return;
        }

        if (documentoActual.getTipo() == 0 && (part ==null || part.getSize() <= 0) && editandoDocumento == false) {
            JsfUtil.addErrorMessage("Debe ingresar la foto a subir");
            return;
        }

        if (documentoActual.getTipo() == 1) {
            part = null;
        }
        if (documentoActual.getTipo() == 0) {
            documentoActual.setLink(null);
        }

        if (editandoDocumento) {
            this.galeriaActual.getDocumentos().remove(documentoActual);
            editandoDocumento = false;
            num_foto_temporal = documentoActual.getId() + "";
        }


        if (num_foto_temporal == null && documentoActual.getTipo() == 0) {
            GenerarIDTemporal();
            documentoActual.setId(Long.parseLong(num_foto_temporal, 10));
        }
        if (part != null) {
            upload();
        }

        documentoActual.setFecha(new Date());
        if (documentoActual.getTipo() == 0) {
            documentoActual.setLink(documentoActual.getId() + ".jpg");
        }
        this.galeriaActual.getDocumentos().add(documentoActual);
        documentoActual = new Documento();
        num_foto_temporal = null;

    }

    public void upload() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ServletContext ss = (ServletContext) facesContext.getExternalContext().getContext();
        String p = ss.getRealPath(path_Imagenes);
        if (part != null) {
            try {

                FileOutputStream m = new FileOutputStream(new File(p + "\\" + num_foto_temporal + ".jpg"));
                long s = part.getSize();
                InputStream inputStream = part.getInputstream();
                for (long i = 0; i < s;) {
                    while (inputStream.available() == 0) {
                        Thread.sleep(10);
                    }
                    int d = inputStream.available();
                    byte mq[] = new byte[d];
                    inputStream.read(mq);
                    m.write(mq);
                    m.flush();
                    i += d;

                }
                m.flush();
                m.close();

                File or = new File(p + "\\" + num_foto_temporal + ".jpg");
                File orx = new File(p + "\\" + num_foto_temporal + ".jpg");
                File re = new File(p + "\\" + num_foto_temporal + "i.jpg");
                BufferedImage originalImage = ImageIO.read(or);
                int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType();

                BufferedImage resizeImageJpg = resizeImage(originalImage, type);
                ImageIO.write(resizeImageJpg, "jpg", re);

                or.delete();

                re.renameTo(orx);



                FacesContext.getCurrentInstance().renderResponse();

            } catch (Exception ex) {
            }

        }





    }

    public void Borrar(Documento nu) {
        File tm = new File(realPath(path_Imagenes + nu.getId() + ".jpg"));
        tm.delete();
        GenericController<Documento> gdoc = new GenericController();
        gdoc.setObjeto(new Documento());
        this.galeriaActual.getDocumentos().remove(nu);
        gdoc.destroy(nu, nu.getId());
    }

    public void Editar(Documento nu) {
        documentoActual = nu;
        editandoDocumento = true;
    }

    public String gAccion() {
        if (editandoDocumento == true) {
            return "Editar";
        } else {
            return "Agregar";
        }
    }

    public String gFoto(Documento s) {
        String cl = s.getId() + "";
        if (!DocumentoTieneFoto(s)) {
            return path_Imagenes + "default.jpg";
        } else {
            return path_Imagenes + cl + ".jpg";
        }
    }

    public String cancelarGaleria() {
        galeriaActual = new Galeria();
        editandoGaleria = false;
        editandoDocumento = false;
        documentoActual = new Documento();
        this.galeriaActual.setDocumentos(new ArrayList());

        return "/backend/FrmGalerias?faces-redirect=true";
    }

    public String irnuevo() {
        galeriaActual = new Galeria();
        editandoGaleria = false;
        editandoDocumento = false;
        documentoActual = new Documento();
        this.galeriaActual.setDocumentos(new ArrayList());

        ///  JsfUtil.addErrorMessage("kjhfdsfkjsdhkjf");
        return "/backend/FrmCrearGaleria";
    }

    public String guardarGaleria() {

        GestorUsuario instance = GestorUsuario.getInstance();
        Escuela escuela = instance.getUsuarioActual().getPersona().getEscuela();
        galeriaActual.setEscuela(escuela);

        if (galeriaActual.getNombre() == null || galeriaActual.getNombre().compareTo("") == 0) {
            JsfUtil.addErrorMessage("Debe ingresar un nombre para la galeria");
            return "";
        }
        if (galeriaActual.getDescripcion() == null || galeriaActual.getDescripcion().compareTo("") == 0) {
            JsfUtil.addErrorMessage("Debe ingresar una descripcion para la galeria");
            return "";
        }
        if (this.galeriaActual.getDocumentos() == null || this.galeriaActual.getDocumentos().isEmpty()) {
            JsfUtil.addErrorMessage("Debe ingresar documentos a la galeria");
            return "";
        }

        GenericController<Galeria> gdocx = new GenericController();
        gdocx.setObjeto(new Galeria());


        if (editandoGaleria) {
            try {
                gdocx.edit(galeriaActual);
            } catch (Exception ex) {
                Logger.getLogger(GestorGalerias.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else {
            gdocx.create(galeriaActual);
        }



        for (Documento s : this.galeriaActual.getDocumentos()) {
            GenericController<Documento> gdoc = new GenericController();
            gdoc.setObjeto(new Documento());
            s.setGaleria(galeriaActual);
            String tmid = s.getId() + "";//inician on 99999
            if (tmid.startsWith("9999999")) {
                s.setId(null);
                gdoc.create(s);
                String idac = s.getId() + "";
                if (s.getTipo() == 0) {
                    s.setLink(idac + ".jpg");
                    try {
                        gdoc.edit(s);
                    } catch (Exception ex) {
                        Logger.getLogger(GestorGalerias.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                File tm = new File(realPath(path_Imagenes + tmid + ".jpg"));
                File or = new File(realPath(path_Imagenes + idac + ".jpg"));
                tm.renameTo(or);
            } else {
                try {
                    gdoc.edit(s);
                } catch (Exception ex) {
                    Logger.getLogger(GestorGalerias.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

        }


        //JsfUtil.addErrorMessage(galeriaActual.getDocumentos().size() + "");




        galeriaActual = new Galeria();
        editandoGaleria = false;
        editandoDocumento = false;
        documentoActual = new Documento();
        this.galeriaActual.setDocumentos(new ArrayList());
        return "/backend/FrmGalerias?faces-redirect=true";
    }

    public String realPath(String d) {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ServletContext ss = (ServletContext) facesContext.getExternalContext().getContext();
        String p = ss.getRealPath(d);
        return p;
    }

    private boolean DocumentoTieneFoto(Documento s) {
        try {
            String cl = s.getId() + "";
            String sp = realPath(path_Imagenes + cl + ".jpg");
            File as = new File(sp);
            if (as.exists()) {
                return true;
            } else {
                return false;
            }
        } catch (Exception w) {
            return false;
        }
    }

    public List<Galeria> getGalerias() {
        return galerias;
    }

    public void setGalerias(List<Galeria> galerias) {
        this.galerias = galerias;
    }

    public static String pathGaleria() {
        return path_Imagenes;
    }

    public List<Documento> getFotos() {
        return fotos;
    }

    public void setFotos(List<Documento> fotos) {
        this.fotos = fotos;
    }
    private static final int IMG_WIDTH = 540;
    private static final int IMG_HEIGHT = 400;

    private static BufferedImage resizeImage(BufferedImage originalImage, int type) {
        BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, type);
        Graphics2D g = resizedImage.createGraphics();
        g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null);
        g.dispose();

        return resizedImage;
    }

    private static BufferedImage resizeImageWithHint(BufferedImage originalImage, int type) {

        BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, type);
        Graphics2D g = resizedImage.createGraphics();
        g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null);
        g.dispose();
        g.setComposite(AlphaComposite.Src);

        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g.setRenderingHint(RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

        return resizedImage;
    }


    public String preview(Galeria n) {
        Documento arch = n.getDocumentos().get(0);
        if (DocumentoTieneFoto(arch)) {
            return path_Imagenes + arch.getLink();
        } else {
            return path_Imagenes + "default.jpg";
        }

    }

    public String obtlink(Documento n) {
        if (n.getTipo() == 0) {
            return "/pagina_asos" + path_Imagenes + n.getLink();
        } else {

            String tr = n.getLink();
            
            tr= tr.replace("watch?v=", "v/");
            if (tr.startsWith("http")) {
                return tr;
            } else {
                return "http://" + tr;
            }
        }

    }


    public List<Documento> getVideos() {
        return videos;
    }

    public void setVideos(List<Documento> videos) {
        this.videos = videos;
    }
    

}
